home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.3 Development Libraries / SGI IRIX 6.3 Development Libraries.iso / dist6.3 / gl_dev.idb / usr / share / src / OpenGL / toolkits / libaux / vect3d.c.z / vect3d.c
Encoding:
C/C++ Source or Header  |  1996-12-06  |  2.9 KB  |  166 lines

  1. /* Routines to manipulate 3 dimensional vectors.  All these routines
  2.  * should work even if the input and output vectors are the same.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include <GL/gl.h>
  8. #include "3d.h"
  9.  
  10. #if defined(__cplusplus) || defined(c_plusplus)
  11. #define class c_class
  12. #endif
  13.  
  14. void (*errfunc)(char *) = 0;
  15.  
  16. void seterrorfunc(void (*func)(char *))
  17. {
  18.     errfunc = func;
  19. }
  20.  
  21. void error(char *s)
  22. {
  23.     if (errfunc)
  24.     (*errfunc)(s);
  25.     else {
  26.     fprintf(stderr, s); 
  27.     fprintf(stderr, "\n");
  28.     exit(1);
  29.     }
  30. }
  31.  
  32. void diff3(GLdouble p[3], GLdouble q[3], GLdouble diff[3])
  33. {
  34.     diff[0] = p[0] - q[0];
  35.     diff[1] = p[1] - q[1];
  36.     diff[2] = p[2] - q[2];
  37. }
  38.  
  39. void add3(GLdouble p[3], GLdouble q[3], GLdouble sum[3])
  40. {
  41.     sum[0] = p[0] + q[0];
  42.     sum[1] = p[1] + q[1];
  43.     sum[2] = p[2] + q[2];
  44. }
  45.  
  46. void scalarmult(GLdouble s, GLdouble v[3], GLdouble vout[3])
  47. {
  48.     vout[0] = v[0]*s;
  49.     vout[1] = v[1]*s;
  50.     vout[2] = v[2]*s;
  51. }
  52.  
  53. GLdouble dot3(GLdouble p[3], GLdouble q[3])
  54. {
  55.     return p[0]*q[0] + p[1]*q[1] + p[2]*q[2];
  56. }
  57.  
  58. GLdouble length3(GLdouble v[3])
  59. {
  60.     return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
  61. }
  62.  
  63. GLdouble dist3(GLdouble p[3], GLdouble q[3])
  64. {
  65.     GLdouble d[3];
  66.  
  67.     diff3(p, q, d);
  68.     return length3(d);
  69. }
  70.  
  71. void copy3(GLdouble old[3], GLdouble new[3])
  72. {
  73.     new[0] = old[0], new[1] = old[1], new[2] = old[2];
  74. }
  75.  
  76. void crossprod(GLdouble v1[3], GLdouble v2[3], GLdouble prod[3])
  77. {
  78.     GLdouble p[3];    /* in case prod == v1 or v2 */
  79.  
  80.     p[0] = v1[1]*v2[2] - v2[1]*v1[2];
  81.     p[1] = v1[2]*v2[0] - v2[2]*v1[0];
  82.     p[2] = v1[0]*v2[1] - v2[0]*v1[1];
  83.     prod[0] = p[0]; prod[1] = p[1]; prod[2] = p[2];
  84. }
  85.  
  86. void normalize(GLdouble v[3])
  87. {
  88.     GLdouble d;
  89.  
  90.     d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
  91.     if (d == 0.0) {
  92.         error("normalize: zero length vector");
  93.     v[0] = d = 1.0;
  94.     }
  95.     d = 1/d;
  96.     v[0] *= d; v[1] *= d; v[2] *= d;
  97. }
  98.  
  99. void print3(GLdouble v[3])
  100. {
  101.     GLdouble len;
  102.  
  103.     len = length3(v);
  104.     printf("(%g %g %g); len: %g\n", v[0], v[1], v[2], len);
  105. }
  106.  
  107. void printmat3(GLdouble m[3][3])
  108. {
  109.     int i, j;
  110.  
  111.     for (i=0; i<3; i++) {
  112.     for (j=0; j<3; j++)
  113.         printf("%7.4f  ", m[i][j]);
  114.     printf("\n");
  115.     }
  116. }
  117.  
  118. void identifymat3(GLdouble m[3][3])
  119. {
  120.     int i, j;
  121.  
  122.     for (i=0; i<3; i++)
  123.     for (j=0; j<3; j++)
  124.         m[i][j] = (i == j) ? 1.0 : 0.0;
  125. }
  126.  
  127. void copymat3(GLdouble *to, GLdouble *from)
  128. {
  129.     int i;
  130.  
  131.     for (i=0; i<9; i++) {
  132.     *to++ = *from++;
  133.     }
  134. }
  135.  
  136. void xformvec3(GLdouble v[3], GLdouble m[3][3], GLdouble vm[3])
  137. {
  138.     GLdouble result[3];    /* in case v == vm */
  139.     int i;
  140.  
  141.     for (i=0; i<3; i++) {
  142.     result[i] = v[0]*m[0][i] + v[1]*m[1][i] + v[2]*m[2][i];
  143.     }
  144.     for (i=0; i<3; i++) {
  145.     vm[i] = result[i];
  146.     }
  147. }
  148.  
  149. long samepoint(GLdouble p1[3], GLdouble p2[3])
  150. {
  151.     if (p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2])
  152.     return 1;
  153.     return 0;
  154. }
  155.  
  156. void perpnorm(GLdouble p1[3], GLdouble p2[3], GLdouble p3[3], GLdouble n[3])
  157. {
  158.     GLdouble d1[3], d2[3];
  159.  
  160.     diff3(p2, p1, d1);
  161.     diff3(p2, p3, d2);
  162.     crossprod(d1, d2, n);
  163.     normalize(n);
  164. }
  165.  
  166.